import LayerModel from './LayerModel'
import LayerModelSimple from './LayerModelSimple'

export interface LayerModelSimpleList {
    [key: string]: LayerModelSimple<object>
}

/**
 * @ClassName LayerModelLink
 * @Description 联动类型图层模型，管理服务在多个地图上的
 * @Author xuyizhuo
 * @Date 2023/11/16 22:46
 */
export default class LayerModelLink extends LayerModel<object> {
    private layerModels: LayerModelSimpleList // 参与联动的地图图层列表
    private currentModel: string // 当前使用的图层模型
    /**
     *
     * @param {LayerModelSimpleList} layerModels 联动地图的图层模型不能
     * @param curentModel
     */
    constructor(layerModels: LayerModelSimpleList, curentModel: string) {
        super()
        if (!layerModels) {
            throw new Error('开发错误，联动地图的图层模型不能')
        }
        this.layerModels = layerModels
        this.currentModel = curentModel
    }

    /**
     * 根据图层模型加载图层
     */
    add(): LayerModelLink {
        this.layerModels && this.currentModel && this.layerModels[this.currentModel].add()
        return this
    }

    /**
     * 根据图层模型删除图层
     */
    remove(): LayerModelLink {
        // 在所有的地图中都移除图层
        if (this.layerModels) {
            for (const layerModelsKey in this.layerModels) {
                this.layerModels[layerModelsKey].remove()
            }
        }

        return this
    }

    /**
     * 更新当前显示的地图模型
     * @param {[keyof layerModels]} curentModel 跟新当前使用的图层模型
     */
    updateLayerModel(curentModel: string): LayerModelLink {
        if (!this.layerModels.hasOwnProperty(curentModel)) {
            throw new Error('开发错误，无法找到对应的地图类型的图层加载模型，需要查找的模型为：' + curentModel)
        }

        // 修改到当前要显示的模型
        if (this.currentModel !== curentModel) {
            this.currentModel = curentModel
            this.update()
        }

        return this
    }

    /**
     * 更新地图模型
     */
    update(): LayerModelLink {
        // 先删除后加载
        this.remove()
        this.add()
        return this
    }

    /**
     * 设置图层的可见性
     * @param {boolean} visible
     * @returns {LayerModel}
     */
    setVisible(visible: boolean): LayerModelLink {
        if (visible) {
            this.add()
        } else {
            this.remove()
        }
        return this
    }

    /**
     * 飞行定位到图层
     * @returns {LayerModelLink}
     */
    flyTo(): LayerModelLink {
        this.layerModels && this.currentModel && this.layerModels[this.currentModel].flyTo()
        return this
    }
}
